教程_如何控制Franka机械臂在仿真环境下运动
修订日期 | 修订版本 | 修订内容 | 修订人 |
---|---|---|---|
2023/05/09 | V0.1 | 初始化文档 | 曾雨昊 |
2023/05/09 | v0.2 | 修改“自定义测试用例”中的问题,添加新依赖 | 舒瑞 |
本文档参考了franka官方教程和moveit!官方教程撰写。
1.环境安装简介
本例中至少需要安装:Ubuntu、ROS、franka_ros、moveit!,此处不再赘述安装过程,仅给出网络上的安装教程:
- Ubuntu(此处推荐Ubuntu20.04):虚拟机安装Ubuntu教程,若在真实物理PC上安装,仅需省略教程中虚拟机的那一部分,其他完全一样
- ROS(此处推荐Noetic):鱼香ROS提供的一键安装指令:链接,为了避免后续出现问题,此处推荐也对rosdep进行配置
- franka_ros:franka官方教程
- moveit!:moveit!官方教程
2.安装环境ready验证
2.1 验证gazebo和rvize环境ready
在命令行中运行下述命令以添加环境变量:
source /path/to/catkin_ws/devel/setup.sh
此处的path为franka的工作空间,关于工作空间,参考官方链接--构建ROS包一节。 再运行:
roslaunch franka_gazebo panda.launch x:=-0.5 \
world:=$(rospack find franka_gazebo)/world/stone.sdf \
controller:=cartesian_impedance_example_controller \
rviz:=true
此时若环境已完全安装,则可以看到带有石头和RViz的环境。若此时可以通过在rviz中用鼠标拖动末端来控制机器人位姿,则说明ros和rviz已ready。
重新打开一个终端,添加环境变量后运行:
rostopic pub --once /franka_gripper/move/goal franka_gripper/MoveActionGoal "goal: { width: 0.08, speed: 0.1 }"
此时若可以看到,Rviz和gazebo中的机械臂夹爪均已打开,则说明gazebo已ready
2.2 验证moveit!环境ready
打开一个终端,添加环境变量后,执行下述指令:
roslaunch panda_moveit_config demo.launch
再另一个终端中,执行下述指令:
roslaunch moveit_tutorials move_group_interface_tutorial.launch
注意:官方的教程中用到了RvizVisualToolGui来控制机械臂,若在顶部Panels->Add New Panel中找不到这一选项,则需要参考此处的教程先添加这一插件。
添加插件后,可以通过底部的next来控制demo依次运行,若demo运行成功,则moveit!环境已ready
3.使用自定义测试用例控制
控制franka机械臂运动的方式多种多样,此处仅介绍使用moveit!对franka进行开发和控制的方法。注意:这需要对ros和moveit!有一定了解。
1)新建工作空间catkin_ws
2)在工作空间下新建功能包moveit_user
3)在src
路径下新建测试用例文件test_joint_move.cpp
4)编辑CMakeList.txt
与package.xml
文件
add_executable(test_joint_move src/test_joint_move.cpp)
target_link_libraries(test_joint_move ${catkin_LIBRARIES} ${Boost_LIBRARIES})
install(DIRECTORY launch DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION})
在CMakeLists
中的find_package中加入:moveit_ros_planning_interface
在package.xml中加入moveit_ros_planning_interface
作为依赖
5)编译文件,检查是否存在配置错误
catkin make
此处moveit!官方推荐用catkin make
而非catkin_build
编译
6)编写test_joint_move.cpp
,实现功能
#include <moveit/move_group_interface/move_group_interface.h>
int main(int argc, char* argv[])
{
ros::init(argc, argv, "test_joint_move");
ros::NodeHandle node_handle;
ros::AsyncSpinner spinner(1);
spinner.start();
static const std::string PLANNING_GROUP = "panda_arm";
moveit::planning_interface::MoveGroupInterface move_group_interface(PLANNING_GROUP);
std::vector<double> joint_target = move_group_interface.getCurrentJointValues();
if (argc == 3)
{
int i = atoi(argv[1]);
joint_target[i] = atof(argv[2]);
}
else
{
for(int i = 0; i < argc - 1; i++)
{
joint_target[i] = atof(argv[i + 1]);
}
}
move_group_interface.setJointValueTarget(joint_target);
moveit::planning_interface::MoveGroupInterface::Plan my_plan;
moveit::core::MoveItErrorCode success = move_group_interface.plan(my_plan);
if (success.val)
{
move_group_interface.execute(my_plan);
ROS_INFO("move successfully, ret = %d",success.val);
}
else
{
ROS_ERROR("failed to plan motion, ret = %d",success.val);
}
std::vector<double> joint_current = move_group_interface.getCurrentJointValues();
std::stringstream ss;
for(std::size_t i = 0; i < joint_current.size(); ++i)
{
ss << "Joint " << i + 1 << ": " << joint_current[i] << "\n";
}
ROS_INFO_STREAM(ss.str());
ros::shutdown();
return 0;
}
7)编译文件,检查代码是否存在错误
catkin make
8)在命令行执行test_joint_move
节点,观察输出结果
先打开一个终端,添加环境变量后,执行下述指令启动仿真环境:
roslaunch panda_moveit_config demo.launch
再打开一个终端,添加环境变量后,执行下述指令运行节点:
rosrun moveit_user test_joint_move 0 1.5708
此时可以看到,RViz中的机械臂规划出了一条半透明的白色轨迹,然后关节1运动90deg到目标位置。Rviz界面和终端输出如下:
4.遗留问题
- 目前仅能够控制机械臂进行正逆运动学测试,力控尚未实现
- 即便使用官方的测试用例,也存在机械臂规划后在RViz中显示运动时卡顿现象,不明原因